/*  
*			Author : ChenXuefei
*/
#include "stdafx.h"
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>
using namespace std;

#ifdef _DEBUG
	#pragma comment(lib,"opencv_highgui244d.lib")
	#pragma comment(lib,"opencv_imgproc244d.lib")
	#pragma comment(lib,"opencv_core244d.lib")
#else 
	#pragma comment(lib,"opencv_highgui244.lib")
	#pragma comment(lib,"opencv_imgproc244.lib")
	#pragma comment(lib,"opencv_core244.lib")
#endif

#ifdef _DEBUG
	#define CX_ASSERT(expr) assert(expr)
#else 
	#define CX_ASSERT(expr)  
#endif

#define println(str)	cout<<str<<endl;

void aveFilter(cv::InputArray _inmat,cv::OutputArray _outmat)
{
	if(_inmat.empty())
		return ;
	cv::Mat inmat=_inmat.getMat();

	int type=inmat.type();
	
	CX_ASSERT(type==CV_8UC3 || type==CV_8UC1);

	size_t elesize=inmat.elemSize();

	cv::Mat &outmat=_outmat.getMatRef();
	outmat=cv::Mat::zeros(inmat.rows,inmat.cols,type);

	//for(int i=1;i<inmat.rows;++i)
	//{
	//	for(int j=1;j<inmat.cols;++j)
	//	{
	//		cv::Mat kernel=inmat(cv::Rect(i-1,j-1,3,3));		
	//	}
	//}
	cv::medianBlur(inmat,outmat,3);
}


void	cxSobel(cv::InputArray _inmat,cv::OutputArray _outmat)
{
	if(_inmat.empty())
		return ;
	cv::Mat inmat=_inmat.getMat();

	int type=inmat.type();
	
	CX_ASSERT(type==CV_8UC3 || type==CV_8UC1);

	size_t elesize=inmat.elemSize();

	cv::Mat outmat=_outmat.getMatRef();
	outmat=cv::Mat::zeros(inmat.rows,inmat.cols,type);

	cv::Sobel(inmat,outmat,CV_8U,1,0);
}


void	cxLaplace(cv::InputArray _inmat,cv::OutputArray _outmat)
{
	if(_inmat.empty())
		return ;
	cv::Mat inmat=_inmat.getMat();

	int type=inmat.type();
	
	CX_ASSERT(type==CV_8UC3 || type==CV_8UC1);

	size_t elesize=inmat.elemSize();

	cv::Mat outmat=_outmat.getMatRef();
	outmat=cv::Mat::zeros(inmat.rows,inmat.cols,type);

	cv::Laplacian(inmat,outmat,CV_8U);
}

void	cxCanny(cv::InputArray _inmat,cv::OutputArray _outmat)
{
	if(_inmat.empty())
		return ;
	cv::Mat inmat=_inmat.getMat();

	int type=inmat.type();
	
	CX_ASSERT(type==CV_8UC3 || type==CV_8UC1);

	size_t elesize=inmat.elemSize();

	cv::Mat tmpmat;

	if(inmat.type()==CV_8UC3)
		cv::cvtColor(inmat,tmpmat,cv::COLOR_BGR2GRAY);
	else 
		tmpmat=inmat;

	cv::Mat outmat=_outmat.getMatRef();
	outmat=cv::Mat::zeros(inmat.rows,inmat.cols,CV_8UC1);

	cv::Canny(tmpmat,outmat,80.0,160.0);
}

//
//int _tmain(int argc, _TCHAR* argv[])
//{
//	cv::namedWindow("MyWindow");
//	
//	cv::Mat inmat=cv::imread("../Img/src.jpg");
//
//	if(inmat.empty())
//	{
//		println("Image open failed!");
//		println("Please make sure image file is put in ../Img/ !");
//		system("pause");
//		return -1;
//	}
//	
//	println("This is src image..");
//	cv::imshow("MyWindow",inmat);
//	cv::waitKey();
//
//
//	cv::Mat mat;
//	cv::Mat tmpmat;
//
//	println("This is median filter..");
//	CX_ASSERT(!inmat.empty());
//	aveFilter(inmat,mat);
//	CX_ASSERT(!mat.empty());
//	cv::imshow("MyWindow",mat);
//	cv::imwrite("../Img/media.jpg",mat);
//	println("Write in media.jpg");
//	cv::waitKey();
//
//
//
//	println("This is sobel filter..");
//	CX_ASSERT(!inmat.empty());
//	aveFilter(inmat,tmpmat);
//	cxSobel(tmpmat,mat);
//	CX_ASSERT(!mat.empty());
//	cv::imshow("MyWindow",mat);
//	cv::imwrite("../Img/sobel.jpg",mat);
//	println("Write in sobel.jpg");
//	cv::waitKey();
//
//
//	println("This is laplace filter..");
//	CX_ASSERT(!inmat.empty());
//	aveFilter(inmat,tmpmat);
//	cxLaplace(tmpmat,mat);
//	CX_ASSERT(!mat.empty());
//	cv::imshow("MyWindow",mat);
//	cv::imwrite("../Img/laplace.jpg",mat);
//	println("Write in laplace.jpg");
//	cv::waitKey();
//
//
//	println("This is canny filter..");
//	CX_ASSERT(!inmat.empty());
//	aveFilter(inmat,tmpmat);
//	cxCanny(tmpmat,mat);
//	CX_ASSERT(!mat.empty());
//	cv::imshow("MyWindow",mat);
//	cv::imwrite("../Img/canny.jpg",mat);
//	println("Write in canny.jpg");
//	cv::waitKey();
//
//	println("Exit!");
//	return 0;
//}
//
